#include<event2/event.h>
#include<event2/listener.h>
#include<iostream>
#include<string.h>
#include <signal.h>
#define SPORT 6666
using namespace std;
void listen_cb(struct evconnlistener * e, evutil_socket_t s, struct sockaddr * a, int socklen, void *arg)
{
    cout<<"listen_cb"<<endl;
}
int main()
{
    //忽略管道信号，发生数据给已关闭的sokect
    if(signal(SIGPIPE,SIG_IGN)==SIG_ERR)
    {
        return 1;
    }
    //创建libevent上下文
    event_base *base =event_base_new();
    if(base)
    {
        cout<<"event_base successful"<<endl;
    }
    //监听端口：sokect listen bind 绑定事件
    sockaddr_in sin;
    memset(&sin,0,sizeof(sin));
    sin.sin_family=AF_INET;
    sin.sin_port=htons(SPORT);
    evconnlistener *evlisten= evconnlistener_new_bind(base,//libevent 上下文
        listen_cb,//接受到连接的回调函数
        base,//回调函数获取的参数arg
        LEV_OPT_REUSEABLE | LEV_OPT_CLOSE_ON_FREE,//地址重用，listen关闭sokect
        10,//连接管理队列大小，对应listen函数
        (sockaddr*)&sin, //绑定地址和端口
        sizeof(sin)
    );
    //事件分发处理
    event_base_dispatch(base);
    //清理
    evconnlistener_free(evlisten);
    if(base)
        event_base_free(base);
    return 0;
}